{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c17c940a-b7cf-4414-92bc-1dfa87e4b240",
   "metadata": {},
   "source": [
    "# Allen-Cahn Equation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "25e33609-b37d-436d-b2b0-200577847ded",
   "metadata": {},
   "outputs": [],
   "source": [
    "import jax\n",
    "import jax.numpy as jnp\n",
    "\n",
    "import optax\n",
    "from flax import linen as nn\n",
    "\n",
    "import sys\n",
    "import os\n",
    "\n",
    "import time\n",
    "import scipy\n",
    "\n",
    "# Add /src to path\n",
    "path_to_src = os.path.abspath(os.path.join(os.getcwd(), '../../../../src'))\n",
    "if path_to_src not in sys.path:\n",
    "    sys.path.append(path_to_src)\n",
    "\n",
    "from KAN import KAN\n",
    "from PIKAN import *\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dca1f133-8abf-44fe-9f98-2cf13efb29ed",
   "metadata": {},
   "source": [
    "### Collocation Points"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "dd634f87-0bea-47ea-834e-5b4b4afa40db",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Generate Collocation points for PDE\n",
    "N = 2**12\n",
    "collocs = jnp.array(sobol_sample(np.array([0,-1]), np.array([1,1]), N)) # (4096, 2)\n",
    "\n",
    "# Generate Collocation points for BCs\n",
    "N = 2**6\n",
    "\n",
    "BC1_colloc = jnp.array(sobol_sample(np.array([0,-1]), np.array([0,1]), N)) # (64, 2)\n",
    "BC1_data = ((BC1_colloc[:,1]**2)*jnp.cos(jnp.pi*BC1_colloc[:,1])).reshape(-1,1)\n",
    "\n",
    "BC2_colloc = jnp.array(sobol_sample(np.array([0,-1]), np.array([1,-1]), N)) # (64, 2)\n",
    "BC2_data = -jnp.ones(BC2_colloc.shape[0]).reshape(-1,1) # (64, 1)\n",
    "\n",
    "BC3_colloc = jnp.array(sobol_sample(np.array([0,1]), np.array([1,1]), N)) # (64, 2)\n",
    "BC3_data = -jnp.ones(BC3_colloc.shape[0]).reshape(-1,1) # (64, 1)\n",
    "\n",
    "# Create lists for BCs\n",
    "bc_collocs = [BC1_colloc, BC2_colloc, BC3_colloc]\n",
    "bc_data = [BC1_data, BC2_data, BC3_data]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eefadd88-07ae-407c-88cb-d46dd35158f4",
   "metadata": {},
   "source": [
    "### Loss Function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "7909b8a2-a88e-495c-9fc3-0be21e2a4c2e",
   "metadata": {},
   "outputs": [],
   "source": [
    "def pde_loss(params, collocs, state):\n",
    "    # Eq. parameter\n",
    "    D = jnp.array(0.001, dtype=float)\n",
    "    c = jnp.array(5.0, dtype=float)\n",
    "    \n",
    "    # Define the model function\n",
    "    variables = {'params' : params, 'state' : state}\n",
    "    \n",
    "    def u(vec_x):\n",
    "        y, spl = model.apply(variables, vec_x)\n",
    "        return y\n",
    "        \n",
    "    # Physics Loss Terms\n",
    "    u_t = gradf(u, 0, 1)  # 1st order derivative of t\n",
    "    u_xx = gradf(u, 1, 2) # 2nd order derivative of x\n",
    "    \n",
    "    # Residual\n",
    "    pde_res = u_t(collocs) - D*u_xx(collocs) - c*(u(collocs)-(u(collocs)**3))\n",
    "    \n",
    "    return pde_res"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a58c2b06-fd40-4f88-a98d-0fc1fd7eb34e",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "### Training Baseline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "0bf038b5-1d07-4dcf-bd0e-86d3e23d54ad",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Initialize model\n",
    "layer_dims = [2, 8, 8, 1]\n",
    "model = KAN(layer_dims=layer_dims, k=3, const_spl=False, const_res=False, add_bias=True, grid_e=0.05)\n",
    "variables = model.init(jax.random.PRNGKey(0), jnp.ones([1, 2]))\n",
    "\n",
    "# Define learning rates for scheduler\n",
    "lr_vals = dict()\n",
    "lr_vals['init_lr'] = 0.001\n",
    "lr_vals['scales'] = {0 : 1.0}\n",
    "\n",
    "# Define epochs for grid extension, along with grid sizes\n",
    "grid_extend = {0 : 3}\n",
    "\n",
    "# Define global loss weights\n",
    "glob_w = [jnp.array(1.0, dtype=float), jnp.array(1.0, dtype=float), jnp.array(1.0, dtype=float), jnp.array(1.0, dtype=float)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "be30eb3c-9594-4851-bfad-45f35954b791",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 0: Performing grid update\n",
      "Total Time: 476.347861289978 s\n",
      "Average time per iteration: 0.0048 s\n"
     ]
    }
   ],
   "source": [
    "num_epochs = 100000\n",
    "\n",
    "model, variables, train_losses = train_PIKAN(model, variables, pde_loss, collocs, bc_collocs, bc_data, glob_w=glob_w, \n",
    "                                             lr_vals=lr_vals, adapt_state=False, loc_w=None, nesterov=False, \n",
    "                                             num_epochs=num_epochs, grid_extend=grid_extend, grid_adapt=[], \n",
    "                                             colloc_adapt={'epochs' : []})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "137cdacd-b0ef-4096-b629-60f03d3d723a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "L^2 Error = 44.4296%\n"
     ]
    }
   ],
   "source": [
    "# Draw reference values\n",
    "ref = scipy.io.loadmat('../../External Data/usol_D_0.001_k_5.mat')\n",
    "\n",
    "N_t, N_x = 101, 201\n",
    "\n",
    "t = np.linspace(0.0, 1.0, N_t)\n",
    "x = np.linspace(-1.0, 1.0, N_x)\n",
    "T, X = np.meshgrid(t, x, indexing='ij')\n",
    "coords = np.stack([T.flatten(), X.flatten()], axis=1)\n",
    "\n",
    "output, _ = model.apply(variables, jnp.array(coords))\n",
    "baseline = np.array(output).reshape(N_t, N_x)\n",
    "\n",
    "l2err = jnp.linalg.norm(baseline-ref['u'])/jnp.linalg.norm(ref['u'])\n",
    "print(f\"L^2 Error = {l2err*100:.4f}%\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6377dd74-ccd8-481e-91b4-25ff7e1e4cc0",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.savez('../../Plots/data/eq4-base.npz', t=t, x=x, baseline=baseline, ref=ref['u'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1c7c47c9-8a93-49b6-a86a-070965573458",
   "metadata": {},
   "source": [
    "### Training Adaptive"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "7832afd8-8bdb-4ab5-9571-f4577e0f0e2e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Initialize model\n",
    "layer_dims = [2, 8, 8, 1]\n",
    "model = KAN(layer_dims=layer_dims, k=3, const_spl=False, const_res=False, add_bias=True, grid_e=0.05)\n",
    "variables = model.init(jax.random.PRNGKey(0), jnp.ones([1, 2]))\n",
    "\n",
    "# Define learning rates for scheduler\n",
    "lr_vals = dict()\n",
    "lr_vals['init_lr'] = 0.001\n",
    "lr_vals['scales'] = {0 : 1.0, 15_000 : 0.6, 25_000 : 0.8, 50_000 : 0.7, 75_000 : 0.7}\n",
    "\n",
    "# Define epochs for grid adaptation\n",
    "adapt_every = 275\n",
    "adapt_stop = 70000\n",
    "grid_adapt = [i * adapt_every for i in range(1, (adapt_stop // adapt_every) + 1)]\n",
    "\n",
    "# Define epochs for grid extension, along with grid sizes\n",
    "grid_extend = {0 : 3, 8000 : 8, 20_000 : 12}\n",
    "\n",
    "# Define global loss weights\n",
    "glob_w = [jnp.array(1.0, dtype=float), jnp.array(1.0, dtype=float), jnp.array(1.0, dtype=float), jnp.array(1.0, dtype=float)]\n",
    "\n",
    "# Initialize RBA weights\n",
    "loc_w = [jnp.ones((collocs.shape[0],1)), jnp.ones((BC1_colloc.shape[0],1)),\n",
    "         jnp.ones((BC2_colloc.shape[0],1)), jnp.ones((BC3_colloc.shape[0],1))]\n",
    "\n",
    "# Perform adaptive collocation point sampling\n",
    "colloc_adapt = dict({'M' : 2**17, 'k' : jnp.array(1.0, dtype=float), 'c' : jnp.array(1.0, dtype=float)})\n",
    "colloc_adapt['epochs'] = [20_000, 30_000, 40_000, 50_000, 60_000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4c1cecc2-d43d-4383-8814-4ff603f82941",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 0: Performing grid update\n",
      "Epoch 8000: Performing grid update\n",
      "Epoch 20000: Performing grid update\n",
      "Total Time: 1211.957454919815 s\n",
      "Average time per iteration: 0.0121 s\n"
     ]
    }
   ],
   "source": [
    "num_epochs = 100000\n",
    "\n",
    "model, variables, train_losses = train_PIKAN(model, variables, pde_loss, collocs, bc_collocs, bc_data, glob_w=glob_w, \n",
    "                                             lr_vals=lr_vals, adapt_state=True, loc_w=loc_w, nesterov=True, \n",
    "                                             num_epochs=num_epochs, grid_extend=grid_extend, grid_adapt=grid_adapt, \n",
    "                                             colloc_adapt=colloc_adapt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "d7adc28b-2c5d-484d-b3f0-3fae147fbb4d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "L^2 Error = 1.4143%\n"
     ]
    }
   ],
   "source": [
    "# Draw reference values\n",
    "ref = scipy.io.loadmat('../../External Data/usol_D_0.001_k_5.mat')\n",
    "\n",
    "N_t, N_x = 101, 201\n",
    "\n",
    "t = np.linspace(0.0, 1.0, N_t)\n",
    "x = np.linspace(-1.0, 1.0, N_x)\n",
    "T, X = np.meshgrid(t, x, indexing='ij')\n",
    "coords = np.stack([T.flatten(), X.flatten()], axis=1)\n",
    "\n",
    "output, _ = model.apply(variables, jnp.array(coords))\n",
    "adaptive = np.array(output).reshape(N_t, N_x)\n",
    "\n",
    "l2err = jnp.linalg.norm(adaptive-ref['u'])/jnp.linalg.norm(ref['u'])\n",
    "print(f\"L^2 Error = {l2err*100:.4f}%\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b263ffa3-41f2-407d-a507-b3c3a2f59ac8",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "b56790ab-26eb-48ef-a3f5-120cd9fe4c84",
   "metadata": {},
   "source": [
    "### Final Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "286f3bf5-7b85-44f7-b3fc-44bae9b6ec6a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\u001b[3m                                  KAN Summary                                   \u001b[0m\n",
      "┏━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓\n",
      "┃\u001b[1m \u001b[0m\u001b[1mpath    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mmodule  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1minputs     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1moutputs    \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mparams     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mstate       \u001b[0m\u001b[1m \u001b[0m┃\n",
      "┡━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩\n",
      "│          │ KAN      │ \u001b[2mfloat32\u001b[0m[40… │ -           │ bias_0:     │              │\n",
      "│          │          │             │ \u001b[2mfloat32\u001b[0m[40… │ \u001b[2mfloat32\u001b[0m[8]  │              │\n",
      "│          │          │             │ - -         │ bias_1:     │              │\n",
      "│          │          │             │ \u001b[2mfloat32\u001b[0m[8,… │ \u001b[2mfloat32\u001b[0m[8]  │              │\n",
      "│          │          │             │   -         │ bias_2:     │              │\n",
      "│          │          │             │ \u001b[2mfloat32\u001b[0m[8,… │ \u001b[2mfloat32\u001b[0m[1]  │              │\n",
      "│          │          │             │   -         │             │              │\n",
      "│          │          │             │ \u001b[2mfloat32\u001b[0m[1,… │ \u001b[1m17 \u001b[0m\u001b[1;2m(68 B)\u001b[0m   │              │\n",
      "├──────────┼──────────┼─────────────┼─────────────┼─────────────┼──────────────┤\n",
      "│ layers_0 │ KANLayer │ \u001b[2mfloat32\u001b[0m[40… │ -           │ c_basis:    │ grid:        │\n",
      "│          │          │             │ \u001b[2mfloat32\u001b[0m[40… │ \u001b[2mfloat32\u001b[0m[16… │ \u001b[2mfloat32\u001b[0m[16,… │\n",
      "│          │          │             │ -           │ c_res:      │              │\n",
      "│          │          │             │ \u001b[2mfloat32\u001b[0m[8,… │ \u001b[2mfloat32\u001b[0m[16] │ \u001b[1m160 \u001b[0m\u001b[1;2m(640 B)\u001b[0m  │\n",
      "│          │          │             │             │ c_spl:      │              │\n",
      "│          │          │             │             │ \u001b[2mfloat32\u001b[0m[16] │              │\n",
      "│          │          │             │             │             │              │\n",
      "│          │          │             │             │ \u001b[1m128 \u001b[0m\u001b[1;2m(512 B)\u001b[0m │              │\n",
      "├──────────┼──────────┼─────────────┼─────────────┼─────────────┼──────────────┤\n",
      "│ layers_1 │ KANLayer │ \u001b[2mfloat32\u001b[0m[40… │ -           │ c_basis:    │ grid:        │\n",
      "│          │          │             │ \u001b[2mfloat32\u001b[0m[40… │ \u001b[2mfloat32\u001b[0m[64… │ \u001b[2mfloat32\u001b[0m[64,… │\n",
      "│          │          │             │ -           │ c_res:      │              │\n",
      "│          │          │             │ \u001b[2mfloat32\u001b[0m[8,… │ \u001b[2mfloat32\u001b[0m[64] │ \u001b[1m640 \u001b[0m\u001b[1;2m(2.6 KB)\u001b[0m │\n",
      "│          │          │             │             │ c_spl:      │              │\n",
      "│          │          │             │             │ \u001b[2mfloat32\u001b[0m[64] │              │\n",
      "│          │          │             │             │             │              │\n",
      "│          │          │             │             │ \u001b[1m512 \u001b[0m\u001b[1;2m(2.0 \u001b[0m   │              │\n",
      "│          │          │             │             │ \u001b[1;2mKB)\u001b[0m         │              │\n",
      "├──────────┼──────────┼─────────────┼─────────────┼─────────────┼──────────────┤\n",
      "│ layers_2 │ KANLayer │ \u001b[2mfloat32\u001b[0m[40… │ -           │ c_basis:    │ grid:        │\n",
      "│          │          │             │ \u001b[2mfloat32\u001b[0m[40… │ \u001b[2mfloat32\u001b[0m[8,… │ \u001b[2mfloat32\u001b[0m[8,1… │\n",
      "│          │          │             │ -           │ c_res:      │              │\n",
      "│          │          │             │ \u001b[2mfloat32\u001b[0m[1,… │ \u001b[2mfloat32\u001b[0m[8]  │ \u001b[1m80 \u001b[0m\u001b[1;2m(320 B)\u001b[0m   │\n",
      "│          │          │             │             │ c_spl:      │              │\n",
      "│          │          │             │             │ \u001b[2mfloat32\u001b[0m[8]  │              │\n",
      "│          │          │             │             │             │              │\n",
      "│          │          │             │             │ \u001b[1m64 \u001b[0m\u001b[1;2m(256 B)\u001b[0m  │              │\n",
      "├──────────┼──────────┼─────────────┼─────────────┼─────────────┼──────────────┤\n",
      "│\u001b[1m \u001b[0m\u001b[1m        \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m        \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m           \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m      Total\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m721 \u001b[0m\u001b[1;2m(2.9 \u001b[0m\u001b[1m  \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m880 \u001b[0m\u001b[1;2m(3.5 KB)\u001b[0m\u001b[1m \u001b[0m│\n",
      "│\u001b[1m          \u001b[0m│\u001b[1m          \u001b[0m│\u001b[1m             \u001b[0m│\u001b[1m             \u001b[0m│\u001b[1m \u001b[0m\u001b[1;2mKB)\u001b[0m\u001b[1m        \u001b[0m\u001b[1m \u001b[0m│\u001b[1m              \u001b[0m│\n",
      "└──────────┴──────────┴─────────────┴─────────────┴─────────────┴──────────────┘\n",
      "\u001b[1m                                                                                \u001b[0m\n",
      "\u001b[1m                        Total Parameters: 1,601 \u001b[0m\u001b[1;2m(6.4 KB)\u001b[0m\u001b[1m                        \u001b[0m\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "tabulate_fn = nn.tabulate(model, jax.random.PRNGKey(11))\n",
    "\n",
    "table = tabulate_fn(collocs)\n",
    "print(table)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "28134e79-a36f-4422-baba-2c50e44b638b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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X375pVavXq3nnntOkjRmzBj95je/0RNPPGEpIY3mffvss890+eWXa+LEiRo3bpwWLlyo8ePHa8CAATr55JNNt/P666+rR48egWMUyZNPPqmTTz5ZF198sTIyMvT666/r+uuvl9/v15QpU4KWjaZeN9xwgzp06KCZM2dq+/btmjt3rkpLS/Xiiy+2qF6RztFvv/1W5513nnbs2KEbb7xR3bp10x/+8AetWrWqReU3p6amRr///e81ZswYTZo0Sfv379fTTz+tkpISrV+/Xv3791fnzp315JNP6rrrrtOll16qn/70p5KkU089NWy50Zynsbz3AJASDACIgw8++MCQZKxYscIwDMPw+/3Gsccea9x0001By23bts2QZLRq1cr45z//GZi+bt06Q5Jxyy23GIZhGN98840hyXjooYfCbnP37t1GVlaWcf755xtNTU2B6U888YQhyVi4cGFg2rhx44zu3bsH/r169WpDkrF69epm6/fMM88Epk2ZMsVo7uv0f/7nfwxJxqJFi4Kml5eXNzv9+2bOnGlIavZ14oknhtS1R48exsGDB4PKGDdunCHJmD59etD0ZcuWGZKM++67L2j65Zdfbng8HuOzzz4LTJNkeL1e46OPPjKt73e32aZNm6BpmzZtMiQZ11xzTdD0W2+91ZBkrFq1KjCte/fuhiSjvLy8RdszDMOYM2eO0apVK6OmpsYwDMP45JNPDEnG0qVLg5Zr7n39/nsfzft2pK7vvvtuYNru3buN7OxsY+rUqaZ1rq6uNiQZl1xySYv38/vvr2EYRklJidGjR4+gaS2t1zPPPGNIMoqLiw2/3x+Yfssttxg+n8/Yt2+faX1aeo7OnTvXkGT88Y9/DEyrra01evXqFfJ+dO/e3Rg3blzItoYOHWoMHTo08O/Gxkajrq4uaJlvvvnGyMvLM/7zP/8zMO3rr782JBkzZ84MW/8jrJynVt57AEgV3OYKIC4WLVqkvLw8nXPOOZIO3w45atQoLVmyRE1NTSHLjxw5Usccc0zg34MGDVJRUZGWL18uSYE+eWvWrAl7y+g777yj+vp63XzzzUF9BydNmqTc3FzH+6K99NJLateunX784x9rz549gdeAAQN01FFHBd2OZ+aVV17RihUrgl7PPPNMyHLjxo0L26/wuuuuC/r38uXL5fP5dOONNwZNnzp1qgzD0P/7f/8vaPrQoUPVp0+fFtW3OUfet7KyspDtSQp5L44//niVlJS0uPxFixZpxIgRatu2rSTphBNO0IABAyzd6hrt+9anTx+dffbZgX937txZJ554ov7xj3+YbqempkaSAnVuie++v9XV1dqzZ4+GDh2qf/zjH6qurrZcr8mTJwfd7nn22WerqalJX3zxRYvqFekcXb58ubp27arLL788MK1169aaPHlyi8pvjs/nC6TOfr9fe/fuVWNjowYOHKiNGzdaKjPa89Tqew8AqYLbXAE4rqmpSUuWLNE555yjbdu2BaYXFRXp4Ycf1sqVK3X++ecHrXPCCSeElPODH/xAf/zjHyVJ2dnZevDBBzV16lTl5eXpjDPO0IUXXqixY8cqPz9fkgI/hL9/i2RWVpZ69OjR4h/KVn366aeqrq5Wly5dmp2/e/fuFpXzox/9qEWDmxx//PHNTs/IyNCxxx4bNO2LL75Qt27dQhoyJ510UmB+S8puqS+++EJerzdk9N78/Hy1b98+pu1t2bJFH374ocaOHavPPvssMH3YsGGaN2+eampqlJub2+Lyon3fjjvuuJBlOnToELjI0dTUFNL/sGPHjoE67d+/v8V1+8tf/qKZM2eqoqJCBw8eDJpXXV2tdu3atbheZvvQoUMHSWpx395I5+gXX3yhXr16hfRPjHT7ciTPPfecHn74YX388cdqaGgITLd6vkZ7nkZzjAEgFdGYBOC4VatW6auvvtKSJUu0ZMmSkPmLFi0KaUy2xM0336yLLrpIy5Yt01tvvaW77rpLs2fP1qpVq3TaaafFVOdwj5RoLkUNx+/3q0uXLmHTsSMDg9glXCqZnZ3d7KiudpQdrZY+qiOa7b3wwguSpFtuuUW33HJLyPxXXnlFEyZMaHF50b5vPp+v2eWM/xvIaOfOnSGNm9WrV2vYsGHq1q1byMBS4Xz++ec677zz1Lt3bz3yyCMqKChQVlaWli9frt/85jfy+/1R1cvqsk4z++x9t54vvPCCxo8fr5EjR2ratGnq0qWLfD6fZs+erc8//9yROnyfm44bACQCjUkAjlu0aJG6dOkSGPX0u1599VUtXbpU8+fPD2pAfPrppyHLfvLJJyEDv/Ts2VNTp07V1KlT9emnn6p///56+OGH9cILL6h79+6SDg/m0qNHj8A69fX12rZtm4qLi8PW+Ugy8/1RX5tLM8P98OzZs6feeecdnXnmmbY1xuzSvXt3vfPOO9q/f39QOvnxxx8H5tu9Pb/fr08//TSQfkpSVVWV9u3bZ3l7hmFo8eLFOuecc3T99deHzJ81a5YWLVoUVWPS7vctPz9fK1asCJrWr18/SdKFF16oBQsWqKKiQoMHDzYt5/XXX1ddXZ1ee+21oESspbdLJ1L37t21efNmGYYR9HnZunVryLIdOnRodrTlL774Iuhz/PLLL6tHjx569dVXg8r8/uOGonnWqFPnKQCkKvpMAnDUt99+q1dffVUXXnihLr/88pBXaWmp9u/fr9deey1ovWXLlmnXrl2Bf69fv17r1q3TT37yE0mHH0R+6NChoHV69uyptm3bBobwLy4uVlZWlh577LGgpODpp59WdXW1RowYEbbe3bt3l8/n07vvvhs0/be//W3Iskee2fj9H8BXXnmlmpqaNGvWrJB1GhsbIz6exEkXXHCBmpqa9MQTTwRN/81vfiOPxxM4znZuT5Lmzp0bNP2RRx6RJNP3wsxf/vIXbd++XRMmTGj2/Bo1apRWr16tL7/8ssVl2v2+5eTkqLi4OOh15GLFbbfdpjZt2uiaa65RVVVVyLqff/65Hn30UUn/TsG+ey5XV1c323/WbS644AJ9+eWXevnllwPTDh48qAULFoQs27NnT7333nuqr68PTHvjjTe0c+fOoOWaOx7r1q1TRUVF0HKtW7eWFPr5DFdPyf7zFABSFckkAEe99tpr2r9/vy6++OJm559xxhnq3LmzFi1apFGjRgWm9+rVS2eddZauu+461dXVae7cuTr66KN12223STqcUp533nm68sor1adPH2VkZGjp0qWqqqrS6NGjJR2+HXHGjBm69957NXz4cF188cXaunWrfvvb3+r000/Xz372s7D1bteuna644go9/vjj8ng86tmzp954441m+zkOGDBAknTjjTeqpKREPp9Po0eP1tChQ3Xttddq9uzZ2rRpk84//3xlZmbq008/1UsvvaRHH300aECScF5++WUdddRRIdN//OMfBx6TEq2LLrpI55xzjn7xi19o+/bt6tevn95++23993//t26++Wb17NnTUrnh9OvXT+PGjdOCBQu0b98+DR06VOvXr9dzzz2nkSNHBgZmitaiRYvk8/nC/si/+OKL9Ytf/EJLliwJGVQlHLvet5bo2bOnFi9erFGjRumkk07S2LFj1bdvX9XX12vt2rV66aWXAs9cPP/885WVlaWLLrpI1157rQ4cOKCnnnpKXbp00VdffWVLfayKdI5OmjRJTzzxhMaOHasNGzaoa9eu+sMf/hBo6H3XNddco5dfflnDhw/XlVdeqc8//1wvvPBCyDl54YUX6tVXX9Wll16qESNGaNu2bZo/f7769OmjAwcOBJZr1aqV+vTpoxdffFE/+MEP1LFjR/Xt21d9+/YN2bZT5ykApKxEDSMLID1cdNFFRk5OjlFbWxt2mfHjxxuZmZnGnj17Ao/eeOihh4yHH37YKCgoMLKzs42zzz7b+N///d/AOnv27DGmTJli9O7d22jTpo3Rrl07o6ioKOjRA0c88cQTRu/evY3MzEwjLy/PuO6664xvvvkmaJnvPx7CMA4/UuCyyy4zWrdubXTo0MG49tprjc2bN4c8GqSxsdG44YYbjM6dOxsejyfkMSELFiwwBgwYYLRq1cpo27atccoppxi33Xab8eWXX5oeO7PHLug7j1M48riLl156KaSM5h7TccT+/fuNW265xejWrZuRmZlpnHDCCcZDDz0U9IgIwzj8aJApU6aY1rUl22xoaDDuvfde4/jjjzcyMzONgoICY8aMGcahQ4eCluvevbsxYsSIiNupr683jj76aOPss882Xe744483TjvtNMMwWvZokCNa8r6Fq+v3H2MRySeffGJMmjTJKCwsNLKysoy2bdsaZ555pvH4448HHZ/XXnvNOPXUU42cnByjsLDQePDBB42FCxcakoxt27ZFXa8jjwZ5//33g5YL92ic72vpOWoYhvHFF18YF198sdG6dWujU6dOxk033RR43Mr3t/Pwww8bxxxzjJGdnW2ceeaZxgcffBBSd7/fb9x///1G9+7djezsbOO0004z3njjjWbfz7Vr1xoDBgwwsrKygh4T8v1HgxhG7OdptO89ACQzj2HQSxwAAMTfmjVrdM455wQGJAIAJBf6TAIAAAAAokZjEgAAAAAQNRqTAAAAAICo0WcSAAAAABC1pEom3333XV100UXq1q2bPB6Pli1bFnGdNWvW6Ic//KGys7PVq1cvPfvssyHLzJs3T4WFhcrJyVFRUZHWr19vf+UBAAAAIIUkVWOytrZW/fr107x581q0/LZt2zRixAidc8452rRpk26++WZdc801euuttwLLvPjiiyorK9PMmTO1ceNG9evXTyUlJc0+Sw4AAAAAcFjS3ubq8Xi0dOlSjRw5Muwyt99+u958801t3rw5MG306NHat2+fysvLJUlFRUU6/fTT9cQTT0iS/H6/CgoKdMMNN2j69Oktqovf79eXX36ptm3byuPxWN8pAAAAIIUZhqH9+/erW7du8nqTJ9c6dOiQ6uvrbSsvKytLOTk5tpWXKBmJroCTKioqVFxcHDStpKREN998sySpvr5eGzZs0IwZMwLzvV6viouLVVFREbbcuro61dXVBf69a9cu9enTx97KAwAAAClq586dOvbYYxNdjRY5dOiQ8lu1U7Xsa0zm5+dr27ZtSd+gTOnGZGVlpfLy8oKm5eXlqaamRt9++62++eYbNTU1NbvMxx9/HLbc2bNn69577w2ZftmP5yozs5U9lQcAAABSTEPDt3plxc1q27ZtoqvSYvX19apWveZoiFrZ0Hz6Vo26tXKt6uvraUymoxkzZqisrCzw75qaGhUUFMiX3VoZNjYmvf6kvAMZAAAAMJWMXcPaeDPVyhN788lreCS/DRVygZRuTObn56uqqipoWlVVlXJzc9WqVSv5fD75fL5ml8nPzw9bbnZ2trKzsx2pMwAAAAD38fokrw1tYK+hlGlMJk+vVwsGDx6slStXBk1bsWKFBg8eLOlwx9cBAwYELeP3+7Vy5crAMk7z+o2wLwAAAABwq6RKJg8cOKDPPvss8O9t27Zp06ZN6tixo4477jjNmDFDu3bt0vPPPy9J+vnPf64nnnhCt912m/7zP/9Tq1at0h//+Ee9+eabgTLKyso0btw4DRw4UIMGDdLcuXNVW1urCRMmxH3/AAAAALiTx+uR14bbcz1G8t3iG05SNSY/+OADnXPOOYF/H+m3OG7cOD377LP66quvtGPHjsD8448/Xm+++aZuueUWPfroozr22GP1+9//XiUlJYFlRo0apa+//lp33323Kisr1b9/f5WXl4cMytMSJIoAAAAA0kXSPmfSTWpqatSuXTuNvuB3ymI0VwAAAKBZ9Q3fasnya1VdXa3c3NxEV6dFjvzWf7r1MLW2YQCeg0ajJh5ck1THIJykSiYBAAAAIBG8Nt3m6k2h21xTegAeAAAAAIAzSCYBAAAAIAKv18ZHg6QIGpMAAAAAEIHXx22u38dtrgAAAACAqJFMAgAAAEAEXs/hW11jLscfexluQTIJAAAAAIgaySQAAAAAROD1eeS1YQQeO/pdugWNSQAAAACIwOc9/Iq5nNiLcA1ucwUAAAAARI1kEgAAAAAi8Hptus1V3OYKAAAAAGnD47NnNNcU6jLJba4AAAAAgOiRTAIAAABABF6vbLrNNXXQmAQAAACACA43Jm0oJ/YiXCOV9gUAAAAAECckkwAAAAAQgdfrkdfHaK7fRTIJAAAAAIgaySQAAAAARODzHn7FXI4RexluQWMSAAAAACLw+rjN9fu4zRUAAAAAEDUakwAAAAAQwZFHg9jxsmLevHkqLCxUTk6OioqKtH79+rDLfvTRR7rssstUWFgoj8ejuXPnhiwze/ZsnX766Wrbtq26dOmikSNHauvWrVHVicYkAAAAAETg9Xpse0XrxRdfVFlZmWbOnKmNGzeqX79+Kikp0e7du5td/uDBg+rRo4ceeOAB5efnN7vMn/70J02ZMkXvvfeeVqxYoYaGBp1//vmqra1tcb3oMwkAAAAALvbII49o0qRJmjBhgiRp/vz5evPNN7Vw4UJNnz49ZPnTTz9dp59+uiQ1O1+SysvLg/797LPPqkuXLtqwYYN+9KMftaheNCYBAAAAIAKPT/L6bCjn//6/pqYmaHp2drays7NDlq+vr9eGDRs0Y8aMwDSv16vi4mJVVFTEXqH/U11dLUnq2LFji9fhNlcAAAAAiLOCggK1a9cu8Jo9e3azy+3Zs0dNTU3Ky8sLmp6Xl6fKykpb6uL3+3XzzTfrzDPPVN++fVu8HskkAAAAAERgtb9jSDnG4TJ27typ3NzcwPTmUsl4mTJlijZv3qw///nPUa1HYxJpxR/DF4DXn0JPmAUAAEBUvDbd5nrk1tDc3NygxmQ4nTp1ks/nU1VVVdD0qqqqsIPrRKO0tFRvvPGG3n33XR177LFRrcttrgAAAADgUllZWRowYIBWrlwZmOb3+7Vy5UoNHjzYcrmGYai0tFRLly7VqlWrdPzxx0ddBskk0kqkdNEsuYwl1QyHtBMAACA5+Dwe+Wz4PejzR19GWVmZxo0bp4EDB2rQoEGaO3euamtrA6O7jh07Vsccc0yg32V9fb3+/ve/B/57165d2rRpk4466ij16tVL0uFbWxcvXqz//u//Vtu2bQP9L9u1a6dWrVq1qF40JgEAAAAgAq/38MuOcqI1atQoff3117r77rtVWVmp/v37q7y8PDAoz44dO+T9TsFffvmlTjvttMC/58yZozlz5mjo0KFas2aNJOnJJ5+UJA0bNixoW88884zGjx/fonrRmAS+g6QQAAAAblRaWqrS0tJm5x1pIB5RWFgowzD/XRtpfkvQmAQAAACACLw+j7w++0ZzTQU0JgEAAAAggkTe5upWKbQrAAAAAIB4IZkEAAAAgAg8XkMeb+z9DO0owy1IJgEAAAAAUSOZBAAAAIAIPN7DLzvKSRU0JgEAAAAgAo/HkMdjw22uNpThFknXLp43b54KCwuVk5OjoqIirV+/Puyyw4YNk8fjCXmNGDEisMz48eND5g8fPjweuwIAAAAASSupkskXX3xRZWVlmj9/voqKijR37lyVlJRo69at6tKlS8jyr776qurr6wP//te//qV+/frpiiuuCFpu+PDheuaZZwL/zs7Odm4nAAAAACQdbnMNlVSNyUceeUSTJk3ShAkTJEnz58/Xm2++qYULF2r69Okhy3fs2DHo30uWLFHr1q1DGpPZ2dnKz893ruIAAAAAkprHa8jLaK5BkqZdXF9frw0bNqi4uDgwzev1qri4WBUVFS0q4+mnn9bo0aPVpk2boOlr1qxRly5ddOKJJ+q6667Tv/71L1vrDgAAAACpJmmSyT179qipqUl5eXlB0/Py8vTxxx9HXH/9+vXavHmznn766aDpw4cP109/+lMdf/zx+vzzz3XHHXfoJz/5iSoqKuTz+Zotq66uTnV1dYF/19TUWNgjwDq/15PoKtjC60+dK3MAACC1eTw23eaaGj/jJCVRYzJWTz/9tE455RQNGjQoaPro0aMD/33KKafo1FNPVc+ePbVmzRqdd955zZY1e/Zs3XvvvY7WFwAAAIB7eLyGLbeocptrAnTq1Ek+n09VVVVB06uqqiL2d6ytrdWSJUs0ceLEiNvp0aOHOnXqpM8++yzsMjNmzFB1dXXgtXPnzpbtBBAFv9cT9pUq0mEfAQAAUlXSNCazsrI0YMAArVy5MjDN7/dr5cqVGjx4sOm6L730kurq6vSzn/0s4nb++c9/6l//+pe6du0adpns7Gzl5uYGvQAAAACkriOjudrxShVJtStlZWV66qmn9Nxzz2nLli267rrrVFtbGxjddezYsZoxY0bIek8//bRGjhypo48+Omj6gQMHNG3aNL333nvavn27Vq5cqUsuuUS9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pMewYcMiPuJj+PDhGj58uG11dAuukofn1LFJlRQJsFs6fDbSYR9hDX+PgdTilz2P9fArdf5uJE1jEgAAAAAShdFcQ9GYBGxg9eoziYa7GLwfgCt4UuSXlhPf8aSdANyExiQAAAAARMBorqFoTAIOI320HwlieH5f/I+Ntyl5khInjk8y7X+ycOozngqJZ6S/KSSXAOKJxiQAAAAARGDY1GcywhihSYXGJGxB+oZw0j1FTERSGG/psI9mrO4/iSasIHkEEsdv2DSaawrd5upNdAUAAAAAAMmHZDIOSO1ghVmiZ7XfT7qnhJGke8IG+5E+2i8V+j1GQvoIuFOTcfhlRzmpgsYkAAAAAETAba6haEzayO/1kEImuWRJ7pKlnsnGLEUitUxvJIzxlQ7po5lYfkuQagKIJxqTAAAAABCB36bRXFPpmg+NSeA76IuIcEimAHule/roFKupJokmEBl9JkMxmisAAAAAIGokkzby+o2or+zRxzI1cIUd4ZBaA82z+tng+xZAojAATyiSSQAAAABA1EgmE4w+CrAbabe7kKIgnkjCwe8KwDkMwBOKxiQAAAAAROA3PGriNtcg3OYKpJgjfXd58eKV+Fe8efxGyr+SSTqccwDiZ968eSosLFROTo6Kioq0fv160+Vfeukl9e7dWzk5OTrllFO0fPnysMv+/Oc/l8fj0dy5c6OqE41JAAAAAIjAb9j3itaLL76osrIyzZw5Uxs3blS/fv1UUlKi3bt3N7v82rVrNWbMGE2cOFEffvihRo4cqZEjR2rz5s0hyy5dulTvvfeeunXrFnW9aEwCAOCQRCejvBL7ApBajozmascrWo888ogmTZqkCRMmqE+fPpo/f75at26thQsXNrv8o48+quHDh2vatGk66aSTNGvWLP3whz/UE088EbTcrl27dMMNN2jRokXKzMyMul40JgEAAADAperr67VhwwYVFxcHpnm9XhUXF6uioqLZdSoqKoKWl6SSkpKg5f1+v66++mpNmzZNJ598sqW6MQAPAACACTeNkk3iCSROk3H4ZUc5klRTUxM0PTs7W9nZ2SHL79mzR01NTcrLywuanpeXp48//rjZbVRWVja7fGVlZeDfDz74oDIyMnTjjTda2Q1JJJMAAAAAEHcFBQVq165d4DV79uy4bXvDhg169NFH9eyzz8rjsX7BjGQSABLETWkH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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 5))\n",
    "plt.pcolormesh(T, X, np.abs(ref['u']-adaptive), shading='auto', cmap='Spectral_r') #\n",
    "plt.colorbar()\n",
    "\n",
    "plt.title('Absolute Error for Allen-Cahn Equation')\n",
    "plt.xlabel('t')\n",
    "\n",
    "plt.ylabel('x')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "82f7250a-d6a7-466a-a1c4-5b908be6182d",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.savez('../../Plots/data/eq4-adapt.npz', t=t, x=x, adaptive=adaptive, ref=ref['u'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3ef65e4b-bb26-475d-b07c-bbca6df50d65",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
